n=20
k=5
def dfs(n,k,depth,have_used,path,res):
    #递归出口：
    if depth==k:
        #当深度到达k时，达成了条件
        res.append(path[:])
        return None
    #从1到n
    for i in range(1,n+1):
        if not have_used[i-1]:
            if len(path)==0:
                # path中还没有数据,此时肯定是可以存放的
                have_used[i-1]=True
                path.append(i)
                dfs(n,k,depth+1,have_used,path,res)
                have_used[i-1]=False
                path.pop()
            else:
                if i>path[len(path)-1]:
                    #i值比当前数组中的最后一个元素大,这样是可以的
                    have_used[i-1]=True
                    path.append(i)
                    dfs(n,k,depth+1,have_used,path,res)
                    have_used[i-1]=False
                    path.pop()
                #当后面得到的元素没有当前范围的元素大时，就什么也不做
            #还没有被使用
            # have_used[i-1]=True


def combine(n,k):
    #这里的n其实就是代表这每一轮迭代中的循环次数，其实也是搜索范围
    #k是递归的深度：最多递归多少次
    #状态矩阵
    have_used=[False for _ in range(n)]
    #存放最终结果的矩阵
    res,path=[],[]
    depth=0
    dfs(n,k,0,have_used,path,res)
    print(res)
# print(combine(n,k))
combine(n,k)